home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / wink / source / oaklib.asm < prev    next >
Encoding:
Assembly Source File  |  1991-10-19  |  24.6 KB  |  1,271 lines

  1. ;**************************
  2. ;*                        *
  3. ;* High-C用 OAK2ライブラリー         *
  4. ;*         Programmed by 山崎憲明    *
  5. ;*              NIFTY ID=QGB01416    *
  6. ;*            nanno-NET ID= YAMA      *
  7. ;*                        *
  8. ;**************************
  9. ;
  10. ;このプログラムにおいては、High-C<=>プロテクトモードアセンブラ<=>
  11. ;リアルモードアセンブラ<=>High-Cという相互呼出しを行っています。
  12. ;
  13. ;この動作について、詳しく知りたい方は、以下の文献を参照してください。
  14. ;(プロテクト<=>リアルモード) Dos-Extender p.30 p35 p.99-102
  15. ;(High-C<=>プロテクト) High-C 第一部 9章、14章
  16. ;(参考プログラム) High-C付属サンプル 'tail.c'
  17. ;
  18. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  19. ;
  20. ;    v0.01    Makeing by YAMA cyan
  21. ;    v0.02    ユ-ザ-関数仕様変更 YAMA (Reqest by Ken)
  22. ;    v0.02a    KYB_open()でのmode_chgを復活 by Ken
  23. ;    v0.03    デバッグ用のゴミを除去 by YAMA
  24. ;    v0.04    ネイティブダータが64kを越える場合に起こるlink障害除去 by YAMA
  25. ;    v0.04a    KYB_readのenc_cntのバグ修正及びkancnvflgの追加 by Ken
  26. ;
  27. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  28. ;
  29. ;セグメント宣言
  30. ;
  31. rmcode    segment word public use16
  32. rmcode    ends
  33. rmdata    segment dword public 'DATA' use16
  34. rmdata    ends
  35. pmdata    segment dword public 'DATA' use32
  36. pmdata    ends
  37. pmcode    segment dword public 'CODE' use32
  38. pmcode    ends
  39. DGROUP    group    rmdata,pmdata
  40.  
  41. ;
  42. ;定数
  43. ;
  44. STACK_R    equ    4*1024    ;リアル=>プロテクト(High-C)用に確保すべきスタック量
  45. ;            ;(デフォルト:4 Kbytes : putstr, putsysがこの量以上に
  46. ;                       ;スタックを使用すると、スタックが破壊されるので
  47. ;                       ;要注意!!
  48.  
  49. TRUE    equ    1
  50. FALSE    equ    0
  51. ;
  52. ;キーアドレス
  53. ;
  54. sCAP    equ    55h
  55. sHIRA    equ    56h
  56. sKATA    equ    5Ah
  57.  
  58. sEIJI    equ    6Ah
  59. sEIKO    equ    6Fh
  60. sMUHEN    equ    57h
  61. sHENKAN    equ    58h
  62.  
  63. sKANJI    equ    59h
  64. sZENHAN    equ    71h
  65.  
  66. ;
  67. ;モ-ドフラグ
  68. ;
  69. mKANJI    equ    0002h
  70. mROMA    equ    0008h
  71. mZEN    equ    0020h
  72. mKATA    equ    0080h
  73. mHIRA    equ    0100h
  74.  
  75. ;
  76. ;  かな漢字変換用構造体定義
  77. ;
  78. Funcparm    struc
  79.     wFunc        dw    ?
  80.     wMode        dw    ?
  81.     lpKkname    dd    far
  82.     lpDataparm    dd    far
  83.     wHandle        dw    ?
  84.     Reserved_f    db    2 dup(0)
  85. Funcparm    ends
  86.  
  87. Kkname        struc
  88.     wLevel        dw    ?
  89.     rgchName    db    8 dup(?)
  90.     rgchVersion    db    4 dup(?)
  91.     rgchRevision    db    4 dup(?)
  92.     Reserved_k    db    14 dup(0)
  93. Kkname        ends
  94.  
  95. Dataparm    struc
  96.     wType        dw    0
  97.     wScan        dw    0
  98.     wAscii        dw    0
  99.     wStatus        dw    0
  100.  
  101.     cchResult    dw    0
  102.     lpchResult    dd    far
  103.  
  104.     cchMode        dw    0
  105.     lpchMode    dd    far
  106.     lpattrMode    dd    far
  107.  
  108.     cchSystem    dw    0
  109.     lpchSystem    dd    far
  110.     lpattrSystem    dd    far
  111.  
  112.     cchBuf        dw    0
  113.     lpchBuf        dd    far
  114.     lpattrBuf    dd    far
  115.     cchBufCursor    dw    0
  116.     cchBufAct    dw    0
  117.  
  118.     cchHomonym    dw    0
  119.     lpchHomonym    dd    far
  120.     cchHomonymAct    dw    0
  121.     cchHomonymTotal    dw    0
  122.     cchHomonymNum    dw    0
  123.  
  124.     fKanji        dw    ?
  125.     fNtype        dw    ?
  126.  
  127.     Reserved_d    db    16 dup(0)
  128. Dataparm    ends
  129.  
  130. ;
  131. ;
  132. ;
  133. MAX_X    equ    80
  134. MAX_Y    equ    24
  135.  
  136. ;
  137. ;リアルモードデータセグメント
  138. ;
  139.  
  140. rmdata segment 
  141. ;
  142. ;
  143. ;
  144. call_port    dd    far    ;リアル=>プロテクト呼出しポート
  145. rm_seg        dw    ?    ;リアルモードセグメント値
  146.  
  147. save_rt_ofs    dw    ?
  148. ;
  149. ;  データ領域
  150. ;
  151.         public    modeW
  152.  
  153. fnc    Funcparm    <>
  154. knm    Kkname        <>
  155. dat    Dataparm    <>
  156. buf_size    equ    100
  157. buf        db    8 dup(buf_size dup(0))
  158. Slock        db    FALSE
  159. modeW        dw    0056h or 8000h
  160. modeS        db    '漢  英小',0
  161. sw        dw    0
  162. enc        dw    0
  163. key_c        dw    0
  164. kancnvflg    db    0        ; Apend OAKLIB by Ken
  165. old_cchS    dw    0
  166. old_cchB    dw    0
  167.  
  168. cchR_p        dw    0
  169. k_kind        db    ?
  170. key_tbl        db    16 dup(?)
  171.  
  172. enc_cnt        dw    0        ;bug fixed at v1.00
  173. enc_str        db    7 dup (0)
  174.  
  175.     public    end_real    ;リアルモードエンドアドレス
  176. end_real label    byte
  177.  
  178. rmdata    ends
  179.  
  180. ;
  181. ;プロテクトモードデータセグメント
  182. ;
  183.  
  184. pmdata    segment
  185.  
  186. save_esp_p    dd    ?
  187. save_ss_p    dw    ?    ; Selecter era ! LSS esp,save_esp_p
  188. save_esp_r    dd    ?
  189. save_ss_r    dw    ?    ; Selecter era ! lss esp,save_esp_r
  190. ;
  191. ;表示関数(ユーザー定義)
  192. ;
  193. putstr_p    dd    near
  194. putsys_p    dd    near
  195. putmode_p    dd    near
  196.  
  197. putstr_fp    dd    offset pmcode:putstr_f        ;Bug Fixed at v0.04
  198. putsys_fp    dd    offset pmcode:putsys_f        ;
  199. putmode_fp    dd    offset pmcode:putmode_f        ;
  200.  
  201. pmdata    ends
  202.  
  203. ;
  204. ;
  205. ;
  206.     assume    cs:pmcode,ds:DGROUP
  207.  
  208. ;
  209. ;プロテクトモードーコード
  210. ;
  211.  
  212. pmcode    segment
  213.  
  214. ;
  215. ;プロテクトルーチン    
  216. ;
  217.  
  218. ;
  219. ;call_real:プロテクト=>リアルプロシジャ呼出しルーチン
  220. ;  AX=呼び出す関数のリアルオフセット
  221.  
  222. call_real    proc    near
  223.         mov    save_ss_p,ss    ; SS Selcter save
  224.         mov    save_esp_p,esp    ;リアル=>プロテクト呼出し用スタック確保
  225.         sub    esp,STACK_R
  226.         mov    bx,rm_seg    ;リアルモードセグメント設定
  227.         shl    ebx,16        ;
  228.         mov    bx,ax        ;リアルモードオフセット
  229.         xor    ecx,ecx        ;0 word パラメーター
  230.         mov    ax,250Eh    ;リアルプロシジャ呼出し
  231.         int    21h
  232.         add    esp,STACK_R    ;リアル=>プロテクト呼出し用スタック解放
  233.         ret
  234. call_real    endp
  235.  
  236. ;かな漢システムオープン
  237. ;int     KAN_open(void (*putstr)(), void (*putsys)(),void (*putmode)() );
  238. ;
  239.     public    KAN_open
  240. KAN_open    proc    near
  241.  
  242.         push    ebp        ;High-C用ヘッダー
  243.         mov    ebp,esp
  244.         push    esi
  245.         push    edi
  246.         push    ebx
  247.         push    es
  248.  
  249. ;リアルモード呼出し用初期化ルーチン
  250.         mov    ax,250Dh    ;リアル=>プロテクト呼出し用
  251.         int    21h        ;プロシジャアドレス取得
  252.         mov    dword ptr call_port,eax
  253.  
  254.         mov    ax,ds        ;リアルモード用セグメント算定
  255.         mov    es,ax        ;先頭アドレス
  256.         xor    ebx,ebx        ;
  257.         lea    ecx,end_real    ;リアルモードコードセグメントサイズ
  258.         mov    ax,250Fh    ;プロテクト=>リアルアドレス変換
  259.         int    21h
  260.         ;jc    err        ;エラー処理
  261.         ;test    ecx,0FFFFh    ;
  262.         ;jnz    err        ;
  263.         shr    ecx,16
  264.         mov    rm_seg,cx    ;リアルモードセグメント値保存
  265. ;
  266. ;かな漢変換システム初期化
  267.         mov    esi,[ebp][16]    ;引数 3( void (*putmode)() )
  268.         mov    putmode_p,esi
  269.         mov    esi,[ebp][12]    ;引数 2( void (*putsys)() )
  270.         mov    putsys_p,esi
  271.         mov    esi,[ebp][8]    ;引数 1( void (*putstr)() )
  272.         mov    putstr_p,esi
  273.  
  274.         lea    ax,KAN_open_s    ;プロシジャ KAN_open_s
  275.         call    call_real
  276.  
  277.         pop    es
  278.         pop    ebx        ;High-C用後処理
  279.         pop    edi
  280.         pop    esi
  281.         mov    esp,ebp
  282.         pop    ebp
  283.         ret
  284. KAN_open    endp
  285.  
  286. ;かな漢システムクローズ
  287. ;int     KAN_close();
  288. ;
  289.     public    KAN_close
  290. KAN_close    proc    near
  291.  
  292.         push    ebp        ;High-C用ヘッダー
  293.         mov    ebp,esp
  294.         push    esi
  295.         push    edi
  296.         push    ebx
  297.         push    es
  298.  
  299.         lea    ax,KAN_close_s    ;プロシジャ KAN_close_s
  300.         call    call_real
  301.  
  302.         pop    es
  303.         pop    ebx        ;High-C用後処理
  304.         pop    edi
  305.         pop    esi
  306.         mov    esp,ebp
  307.         pop    ebp
  308.         ret
  309. KAN_close    endp
  310.  
  311. ;キー読み取り(かな漢変換付き)
  312. ;int     KAN_read(int sw, unsigned *enc );
  313. ;
  314.     public    KAN_read
  315. KAN_read    proc    near
  316.  
  317.         push    ebp        ;High-C用ヘッダー
  318.         mov    ebp,esp
  319.         push    esi
  320.         push    edi
  321.         push    ebx
  322.         push    es
  323.         push    ebp
  324.  
  325.         mov    eax,[ebp][8]    ;引数 1( int sw )
  326.         mov    sw,ax
  327.  
  328.         lea    ax,KAN_read_s    ;プロシジャ KAN_read_s
  329.         call    call_real
  330.  
  331.         pop    ebp
  332.         xor    eax,eax
  333.         mov    ax,enc
  334.         mov    edi,[ebp][12]    ;引数 2( unsigned *enc )
  335.         mov    [edi],eax    ;
  336.         mov    ax,key_c    ;リターン:キーコード
  337.  
  338.         pop    es
  339.         pop    ebx        ;High-C用後処理
  340.         pop    edi
  341.         pop    esi
  342.         mov    esp,ebp
  343.         pop    ebp
  344.         ret
  345. KAN_read    endp
  346.  
  347. ;単語登録
  348. ;int     KAN_touroku(int len, char *tango );
  349. ;
  350.     public    KAN_touroku
  351. KAN_touroku    proc    near
  352.  
  353.         push    ebp        ;High-C用ヘッダー
  354.         mov    ebp,esp
  355.         push    esi
  356.         push    edi
  357.         push    ebx
  358.         push    es
  359.         push    ebp
  360.  
  361.         mov    esi,[ebp][12]    ;引数 2( char *tango )
  362.         mov    ecx,[ebp][8]    ;引数 1( int len )
  363.         mov    dat.cchResult,cx
  364.         xor    edi,edi
  365.         mov    di,word ptr dat.lpchResult
  366.         rep    movsb
  367.  
  368.         lea    ax,KAN_touroku_s    ;プロシジャ KAN_read_s
  369.         call    call_real
  370.  
  371.         pop    ebp
  372.  
  373.         pop    es
  374.         pop    ebx        ;High-C用後処理
  375.         pop    edi
  376.         pop    esi
  377.         mov    esp,ebp
  378.         pop    ebp
  379.         ret
  380. KAN_touroku    endp
  381.  
  382.  
  383. ;
  384. ;リアル=>High-C呼出し用プロシジャ:
  385. ;<解説> Dos-Extenderによるリアル=>プロテクト呼出しは、プロテクトFARコール
  386. ;によって行われるため、プロテクトNEARプロシジャであるHigh-C関数を呼び出すには、
  387. ;この様に中継用のプロシジャが必要となる。また、リアル=>プロテクト呼出しの為、
  388. ;スタックフレームがHigh-Cと共用出来ないのを防ぐため、予め用意したプロテクト側の
  389. ;スタックに切り換える。
  390. ;
  391.  
  392. ;    void    putstr(int pos,int len,char *str,char *att);
  393.         public    putstr_f
  394. putstr_f    proc    far
  395.         mov    save_ss_r,ss    ; Selecter Save
  396.         mov    save_esp_r,esp    ;スタックフレーム再構築
  397.         lss    esp,pword ptr save_esp_p ; Load Loacl Stack Address
  398.  
  399.         xor    eax,eax
  400.         mov    ax,word ptr dat.lpattrBuf    ;引数 4( char *att )
  401.         push    eax
  402.         mov    ax,word ptr dat.lpchBuf        ;引数 3( char *str )
  403.         push    eax
  404.         mov    ax,dat.cchBuf            ;引数 2( int len )
  405.         push    eax
  406.         mov    ax,dat.cchBufCursor        ;引数 1( int pos )
  407.         push    eax
  408.         call    putstr_p
  409.         add    esp,4*4        ;引数pop
  410.  
  411.         lss    esp,pword ptr save_esp_r
  412.         ret
  413. putstr_f    endp
  414.  
  415. ;    void    putsys(int len, char *str, char *att);
  416.         public    putsys_f
  417. putsys_f    proc    far
  418.         mov    save_ss_r,ss    ; Selecter Save
  419.         mov    save_esp_r,esp    ;スタックフレーム再構築
  420.         lss    esp,pword ptr save_esp_p ; Load Loacl Stack Address
  421.  
  422.         xor    eax,eax
  423.         mov    ax,word ptr dat.lpattrSystem    ;引数 3( char *att )
  424.         push    eax
  425.         mov    ax,word ptr dat.lpchSystem    ;引数 2( char *str )
  426.         push    eax
  427.         mov    ax,dat.cchSystem        ;引数 1( int len )
  428.         push    eax
  429.         call    putsys_p
  430.         add    esp,3*4        ;引数pop
  431.  
  432.         lss    esp,pword ptr save_esp_r
  433.         ret
  434. putsys_f    endp
  435.  
  436. ;    void    putmode(int mode, int shift, char *str);
  437.         public    putmode_f
  438. putmode_f    proc    far
  439.         mov    save_ss_r,ss    ; Selecter Save
  440.         mov    save_esp_r,esp    ;スタックフレーム再構築
  441.         lss    esp,pword ptr save_esp_p ; Load Loacl Stack Address
  442.  
  443.         xor    eax,eax
  444.         mov    ax,offset modeS    ;引数 3( char *str )
  445.         push    eax
  446.         mov    ax,enc        ;引数 2( int shift )
  447.         and    ax,00FFh
  448.         push    eax
  449.         mov    ax,modeW    ;引数 1( int mode )
  450.         push    eax
  451.         call    putmode_p
  452.         add    esp,3*4        ;引数pop
  453.  
  454.         lss    esp,pword ptr save_esp_r
  455.         ret
  456. putmode_f    endp
  457.  
  458. pmcode    ends
  459.  
  460. ;
  461. ;リアルモードコード
  462. ;
  463.  
  464. rmcode    segment word public use16
  465.  
  466.     assume    cs:rmcode,ds:DGROUP
  467.  
  468. ;
  469. ;call_prot:リアル=>プロテクト呼出しルーチン
  470. ;  EAX=呼び出す関数のネイティブオフセット
  471.  
  472. call_prot    proc    near
  473.         pop    [save_rt_ofs]
  474.         push    dword ptr 0    ;データセグメントは初期設定値
  475.         push    word ptr 0Ch    ;プロテクトモードセレクタ
  476.         push    eax        ;呼び出す関数のネイティブオフセット
  477.         call    call_port    ;プロテクトプロシジャ呼出し
  478.         add    sp,10
  479.         push    [save_rt_ofs]
  480.         ret
  481. call_prot    endp
  482.  
  483. ;
  484. ;  かな漢字変換関数
  485. ;
  486. KKfunc    proc    near
  487.     push    es
  488.     push    ds
  489.     push    bx
  490.     push    cx
  491.     push    dx
  492.     push    si
  493.     push    di
  494.     mov    ax,cs
  495.     mov    ds,ax
  496.     mov    es,ax
  497.  
  498.     mov    ax,fnc.wFunc
  499.     mov    bx,offset fnc
  500.     mov    cx,offset fnc
  501.     mov    dx,offset fnc
  502.     mov    di,offset fnc
  503.     mov    si,offset fnc
  504.  
  505.     int    0EEh
  506.     pop    di
  507.     pop    si
  508.     pop    dx
  509.     pop    cx
  510.     pop    bx
  511.     pop    ds
  512.     pop    es
  513.     ret
  514. KKfunc    endp
  515.  
  516. KKOpen    proc    near
  517.     mov    fnc.wFunc,2
  518.     mov    fnc.wHandle,1
  519.     mov    ax,ds
  520.     mov    word ptr fnc.lpKkname,offset knm
  521.     mov    word ptr fnc.lpKkname+2,ax
  522.     mov    word ptr fnc.lpDataparm,offset dat
  523.     mov    word ptr fnc.lpDataparm+2,ax
  524.     mov    dat.wType,1
  525.     call    KKfunc
  526.     ret
  527. KKOpen    endp
  528.  
  529. KKClose    proc    near
  530.     mov    fnc.wFunc,3
  531.     mov    fnc.wMode,0
  532.     mov    word ptr fnc.lpKkname,0
  533.     mov    word ptr fnc.lpKkname+2,0
  534.     mov    word ptr fnc.lpDataparm,0
  535.     mov    word ptr fnc.lpDataparm+2,0
  536.     call    KKfunc
  537.     ret
  538. KKClose    endp
  539.  
  540. KKInOut    proc    near
  541.     mov    fnc.wFunc,4
  542.     mov    fnc.wMode,0
  543.     mov    word ptr fnc.lpKkname,0
  544.     mov    word ptr fnc.lpKkname+2,0
  545.     mov    ax,ds
  546.     mov    word ptr fnc.lpDataparm,offset dat
  547.     mov    word ptr fnc.lpDataparm+2,ax
  548.  
  549.     mov    word ptr dat.lpchResult,offset buf[0]
  550.     mov    word ptr dat.lpchResult+2,ax
  551.     mov    word ptr dat.lpchMode,offset buf[1*buf_size]
  552.     mov    word ptr dat.lpchMode+2,ax
  553.     mov    word ptr dat.lpattrMode,offset buf[2*buf_size]
  554.     mov    word ptr dat.lpattrMode+2,ax
  555.     mov    word ptr dat.lpchSystem,offset buf[3*buf_size]
  556.     mov    word ptr dat.lpchSystem+2,ax
  557.     mov    word ptr dat.lpattrSystem,offset buf[4*buf_size]
  558.     mov    word ptr dat.lpattrSystem+2,ax
  559.     mov    word ptr dat.lpchBuf,offset buf[5*buf_size]
  560.     mov    word ptr dat.lpchBuf+2,ax
  561.     mov    word ptr dat.lpattrBuf,offset buf[6*buf_size]
  562.     mov    word ptr dat.lpattrBuf+2,ax
  563.     mov    word ptr dat.lpchHomonym,offset buf[7*buf_size]
  564.     mov    word ptr dat.lpchHomonym+2,ax
  565.     call    KKfunc
  566.     ret
  567. KKInOut    endp
  568.  
  569. KKMode    proc    near
  570.     mov    fnc.wFunc,5
  571.     mov    word ptr fnc.lpKkname,0
  572.     mov    word ptr fnc.lpKkname+2,0
  573.     mov    ax,ds
  574.     mov    word ptr fnc.lpDataparm,offset dat
  575.     mov    word ptr fnc.lpDataparm+2,ax
  576.     call    KKfunc
  577.     ret
  578. KKMode    endp
  579.  
  580. KKTrans    proc    near
  581.     mov    fnc.wFunc,6
  582.     mov    fnc.wMode,0
  583.     mov    word ptr fnc.lpKkname,0
  584.     mov    word ptr fnc.lpKkname+2,0
  585.     mov    ax,ds
  586.     mov    word ptr fnc.lpDataparm,offset dat
  587.     mov    word ptr fnc.lpDataparm+2,ax
  588.     mov    fnc.wHandle,1
  589.  
  590.     mov    byte ptr dat.wScan,0
  591.     mov    byte ptr dat.wAscii,0
  592.     mov    byte ptr dat.wStatus,0
  593.     mov    word ptr dat.lpchMode,0
  594.     mov    word ptr dat.lpchMode+2,0
  595.     mov    word ptr dat.lpattrMode,0
  596.     mov    word ptr dat.lpattrMode+2,0
  597.     mov    word ptr dat.lpchSystem,offset buf[3*buf_size]
  598.     mov    word ptr dat.lpchSystem+2,ax
  599.     mov    word ptr dat.lpattrSystem,offset buf[4*buf_size]
  600.     mov    word ptr dat.lpattrSystem+2,ax
  601. ;    mov    word ptr dat.lpchBuf,0
  602. ;    mov    word ptr dat.lpchBuf+2,0
  603. ;    mov    word ptr dat.lpattrBuf,0
  604. ;    mov    word ptr dat.lpattrBuf+2,0
  605.     mov    word ptr dat.lpchHomonym,0
  606.     mov    word ptr dat.lpchHomonym+2,0
  607.     call    KKfunc
  608.     ret
  609. KKTrans    endp
  610.  
  611. ;
  612. ;
  613. ;
  614.  
  615. KYB_check    macro
  616.         mov    ah,07h
  617.         int    90h
  618.         endm
  619.  
  620. KYB_read    macro    sw
  621.         mov    ah,09h
  622.         mov    al,sw
  623.         int    90h
  624.         endm
  625.  
  626. KYB_matrix    macro
  627.         mov    di,offset key_tbl
  628.         mov    ah,0Ah
  629.         int    90h
  630.         endm
  631.  
  632. KYB_KindKb    macro
  633.         mov    ah,0FAh
  634.         int    90h
  635.         endm
  636.  
  637. KYB_setShift    macro
  638.         mov    ah,0FCh
  639.         int    90h
  640.         endm
  641.  
  642. movKs        macro    index,code
  643.     mov    word ptr modeS[index],((code shl 8)or(code shr 8))and 0FFFFh
  644.         endm
  645.  
  646. KYB_read2_s    proc     near
  647. kr2s_lp1:    call    KYBN_check
  648.         cmp    dh,0FFh
  649.         je    kr2s_lp1
  650.         mov    ax,0900h
  651.         int    90h
  652.                 push    ax
  653.                 push    bx
  654.                 push    cx
  655.                 push    dx
  656.                 mov    cl,bh
  657. kr2s_apn31:     mov     ah,07h
  658.                 int    90h
  659.                 cmp     dh,0ffh
  660.                 je      kr2s_apn4
  661.  
  662.             cmp     bh,cl
  663.                 jne     kr2s_apn4
  664.  
  665.                 cmp     bh,4dh
  666.                 je      kr2s_apn32
  667.                 cmp     bh,4fh
  668.                 je      kr2s_apn32
  669.                 cmp     bh,50h
  670.                 je      kr2s_apn32
  671.                 cmp     bh,51h
  672.                 je      kr2s_apn32
  673.         cmp    bh,4Bh
  674.         je    kr2s_apn32
  675.         cmp    bh,4Eh
  676.         je    kr2s_apn32
  677.                 cmp     bh,48h
  678.                 je      kr2s_apn32
  679.                 cmp     bh,72h
  680.                 je      kr2s_apn32
  681.                 cmp     bh,73h
  682.                 jne     kr2s_apn4
  683.  
  684. kr2s_apn32:     mov     ax,0900h
  685.                 int    90h
  686.                 jmp     kr2s_apn31
  687. kr2s_apn4:      
  688.                 pop     dx
  689.                 pop    cx
  690.                 pop     bx
  691.                 pop     ax
  692.                 ret
  693. KYB_read2_s    endp
  694.  
  695. KYB_read2    macro
  696.         call KYB_read2_s
  697.         endm
  698.  
  699. key_test    macro    scan
  700.         test    key_tbl[scan/8],(1 shl (scan mod 8))
  701.         endm
  702.  
  703. key_break    macro    scan
  704.         local    lp
  705. lp:            KYB_matrix
  706.             key_test    scan
  707.             jnz    short lp
  708.         endm
  709.  
  710. putstr_r    proc    near
  711.         mov    eax,[putstr_fp]        ;Bug Fixed at v0.04
  712.         call    call_prot
  713.         mov    ax,dat.cchBuf
  714.         mov    old_cchB,ax
  715.         ret
  716. putstr_r    endp
  717.  
  718. putsys_r    proc    near
  719.         mov    eax,[putsys_fp]        ;Bug Fixed at v0.04
  720.         call    call_prot
  721.         mov    ax,dat.cchSystem
  722.         mov    old_cchS,ax
  723.         ret
  724. putsys_r    endp
  725.  
  726. ;
  727. ;空文字列出力:KAN_readの処理が終わる時、このルーチンによって長さ0の
  728. ;文字列がputstr,putsysに出力される。(画面復元用)
  729. ;
  730. clrstr        proc    near
  731.         push    dat.cchBuf
  732.         push    dat.cchSystem
  733.         mov    dat.cchBuf,0
  734.         mov    dat.cchSystem,0
  735.         mov    eax,[putstr_fp]        ;Bug Fixed at v0.04
  736.         call    call_prot
  737.         mov    eax,[putsys_fp]        ;Bug Fixed at v0.04
  738.         call    call_prot
  739.         mov    old_cchB,0
  740.         mov    old_cchS,0
  741.         pop    dat.cchSystem
  742.         pop    dat.cchBuf
  743.         ret
  744. clrstr        endp
  745.  
  746. ;
  747. ;
  748. ;
  749.  
  750. mode_chg    proc    near
  751.  
  752.         push    di
  753.         push    ax
  754.         push    cx
  755.         push    dx
  756.  
  757.         test    modeW,01h
  758.           jz    short krn_edsk0
  759.             mov        modeW,8055h
  760.             test    bl,02h
  761.             jz        short krn_edsk0
  762.               xor    modeW,0C0h
  763.  
  764. krn_edsk0:    test    modeW,0008h
  765.         jne    short krn_edsk1
  766.           test    modeW,180h
  767.           jz    short krn_edsk1
  768.           or    bl,02h
  769.           mov    al,bl
  770.          jmp    short krn_edsk2
  771.  
  772. krn_edsk1:      and    bl,0FDh
  773.           mov    al,bl
  774. krn_edsk2:      KYB_setShift
  775.         test    modeW,0002h
  776.         je    short krnc_sk11
  777.           movKs    0,'漢'
  778.          jmp    short krnc_sk2
  779. krnc_sk11:      movKs    0,'  '
  780. krnc_sk2:    test    modeW,0008h
  781.         je    short krnc_sk21
  782.           mov    modeS[4],'R'
  783.          jmp    short krnc_sk3
  784. krnc_sk21:      mov    modeS[4],' '
  785. krnc_sk3:    test    modeW,0020h
  786.         je    short krnc_sk31
  787.           movKs    2,'全'
  788.          jmp    short krnc_sk4
  789. krnc_sk31:      movKs    2,'  '
  790. krnc_sk4:    test    modeW,0040h
  791.         je    short krnc_sk42
  792.           movKs    5,'英'
  793.           test    bl,01h
  794.           je    short krnc_sk411
  795.             movKs    7,'大'
  796.            jmp    short krnc_sk5
  797. krnc_sk411:        movKs    7,'小'
  798.            jmp    short krnc_sk5
  799. krnc_sk42:    test    modeW,0080h
  800.         je    short krnc_sk43
  801.           movKs    5,'カ'
  802.           movKs    7,'ナ'
  803.          jmp    short krnc_sk5
  804. krnc_sk43:      movKs    5,'か'
  805.           movKs    7,'な'
  806.  
  807. krnc_sk5:
  808.         mov    enc,bx
  809.         mov    ax,modeW
  810.         mov    fnc.wMode,ax
  811.         call    KKMode
  812.         mov    eax,[putmode_fp]    ;Bug Fixed at v0.04
  813.         call    call_prot
  814.  
  815.         pop    dx
  816.         pop    cx
  817.         pop    ax
  818.         pop    di
  819.         mov    bx,enc
  820.         ret
  821. mode_chg    endp
  822.  
  823. KYBN_check    proc    near
  824.         KYB_matrix
  825.         KYB_check
  826.         cmp    dh,0FFh
  827.         je    krn_sk1
  828.  
  829.         cmp    dh,80h        ;PF key?
  830.         jne    kcn_sk1
  831. ;
  832. ; For oyayubi shift
  833. ;
  834.         cmp    bh,57h        ;
  835.         je    kcn_sk0
  836.         cmp    bh,58h        ;
  837.         jne    kcn_sk01
  838. kcn_sk0:    cmp    k_kind,1    ;JIS?
  839.         je    kcn_sk01
  840.               and    modeW,803Fh
  841.               or    modeW,100h
  842.         push    dx
  843.         push    bx
  844.         call    mode_chg
  845.         pop    bx
  846.         pop    dx
  847.         jmp    kcn_sk2
  848. kcn_sk01:    jmp    kcn_sk3
  849.  
  850. kcn_sk1:    test    modeW,0020h    ;全角?
  851.         jne    kcn_sk2
  852.         test    modeW,0040h    ;英数入力モード?
  853.         jne    kcn_sk3
  854.         test    modeW,0108h    ;ローマ字入力モード or ひらがな?
  855.         jne    kcn_sk2
  856.         jmp    kcn_sk3        ;かな入力モード and かたかな.
  857.  
  858. kcn_sk2:    mov    ah,0FFh        ;変換の必要有り
  859.         ret
  860. kcn_sk3:    mov    ah,0        ;変換の必要なし
  861.         ret
  862. ;
  863. ; For JIS keybord
  864. ;
  865. krn_sk1:      key_test    sCAP
  866.           jz    short krn_sk2
  867.             key_break    sCAP
  868.            jmp    krn_end1
  869.  
  870. krn_sk2:      key_test    sHIRA
  871.           jz    short krn_sk3
  872.             test    bl,10h        ;CTRL
  873.             jz    short krn_sk22
  874.               test    Slock,TRUE
  875.               jnz    krn_sk21
  876.               xor    modeW,0Ch
  877. krn_sk21:          key_break    sHIRA
  878.              jmp    krn_end1
  879. krn_sk22:          test    Slock,TRUE
  880.               jnz    krn_sk23
  881.               xor    modeW,140h
  882. krn_sk23:          test    modeW,100h
  883.               je    short krn_sk21
  884.                and    modeW,813Fh
  885.              jmp    short krn_sk21
  886. krn_sk3:      key_test    sKATA
  887.           jz    short krn_sk4
  888.               test    Slock,TRUE
  889.               jnz    krn_sk32
  890.             xor        modeW,80h
  891.             test    modeW,80h
  892.             je        short krn_sk31
  893.               and    modeW,80BFh
  894.              jmp    short krn_sk32
  895. krn_sk31:          and    modeW,803Fh
  896.               or    modeW,40h
  897. krn_sk32:          key_break    sKATA
  898.               jmp    krn_end1
  899. ;
  900. ; For oyayubi shift keybord
  901. ;
  902. krn_sk4:
  903.           key_test    sEIJI
  904.           jz    short krn_sk5
  905.             test    bl,10h        ;CTRL
  906.             jz    short krn_sk42
  907.               test    Slock,TRUE
  908.               jnz    krn_sk41
  909.               xor    modeW,0Ch
  910. krn_sk41:          key_break    sEIJI
  911.              jmp    krn_end1
  912. krn_sk42:          test    Slock,TRUE
  913.               jnz    krn_sk41
  914.               and    modeW,803Fh
  915.               or        modeW,040h
  916.              jmp    short krn_sk41
  917.  
  918. krn_sk5:      key_test    sEIKO
  919.           jz    short krn_sk6
  920.             test    Slock,TRUE
  921.             jnz        krn_sk52
  922.             test    modeW,040h
  923.             jne        krn_sk52
  924.              and        modeW,803Fh
  925.              or        modeW,080h
  926. krn_sk52:        key_break    sKATA
  927.             jmp    short krn_end1
  928. ;
  929. ;
  930. ;
  931. krn_sk6:      key_test    sZENHAN
  932.           jz    krn_sk7
  933.               test    Slock,TRUE
  934.               jnz    krn_sk61
  935.             xor    modeW,30h
  936. krn_sk61:          key_break    sZENHAN
  937.             jmp    krn_end1
  938. krn_sk7:      key_test    sKANJI
  939.           jz    short krn_end2
  940.               test    Slock,TRUE
  941.               jnz    krn_sk71
  942.             xor        modeW,03h
  943. krn_sk71:        key_break    sKANJI
  944.  
  945. krn_end1:    call    mode_chg
  946.         mov    dx,0FFFFh
  947.         mov    bh,0FFh
  948. krn_end2:    ret
  949. KYBN_check    endp
  950.  
  951.  
  952. ;
  953. ;
  954. ;
  955.     public    KAN_touroku_s
  956. KAN_touroku_s    proc    far
  957.         push    bp
  958.         mov    bp,sp
  959.         mov    ax,cs
  960.         mov    ds,ax
  961.         mov    es,ax
  962.  
  963.         mov    Slock,TRUE
  964.  
  965.         cmp    dat.cchResult,0
  966.         je    ew_end
  967.         call    KKTrans
  968.  
  969. ew_lp4:        call    putsys_r
  970.  
  971.         KYB_read2
  972.         mov    byte ptr dat.wType,0
  973.         mov    byte ptr dat.wScan,bh
  974.         mov    byte ptr dat.wAscii,dl
  975.         mov    byte ptr dat.wStatus,bl
  976.         call    KKInOut
  977.         cmp    dat.cchSystem,0
  978.         jne    ew_lp4
  979.  
  980. ew_end:        call    clrstr
  981.  
  982.         mov    Slock,FALSE
  983.         mov    dat.cchResult,0
  984.         mov    dat.cchBuf,0
  985.         mov    dat.cchSystem,0
  986.  
  987.         xor    eax,eax
  988. err4:        pop    bp
  989.         ret
  990. KAN_touroku_s    endp
  991.  
  992.     public    KAN_read_s
  993. KAN_read_s    proc    far
  994.         push    bp
  995.         mov    bp,sp
  996.         mov    ax,cs
  997.         mov    ds,ax
  998.         mov    es,ax
  999.  
  1000.         mov    cx,cchR_p
  1001.         cmp    cx,dat.cchResult
  1002.         jae    short kr_sk1
  1003.         mov    si,word ptr dat.lpchResult
  1004.         add    si,cx
  1005.         xor    dh,dh
  1006.         mov    dl,[si]
  1007.         mov    bh,byte ptr dat.wScan
  1008.         cmp    enc_cnt,0
  1009.         je    v101_fx2
  1010.         xor    bh,bh
  1011.         dec    enc_cnt
  1012. v101_fx2:    mov    bl,byte ptr dat.wStatus
  1013.         mov    enc,bx
  1014.         mov    key_c,dx
  1015.         inc    cchR_p
  1016.         jmp    kr_end23
  1017.  
  1018. kr_sk1:        cmp    kancnvflg,0        ; Apend OAKLIB by Ken
  1019.         je    ken_fix1
  1020.         mov    kancnvflg,0
  1021.  
  1022.         cmp    sw,1            ; No wait key in?
  1023.         jne    ken_fix1
  1024.  
  1025.         mov    bh,0FFH
  1026.         mov    bl,byte ptr dat.wStatus
  1027.         mov    dx,0FFFFh
  1028.         jmp    ken_fix2        ; Return to Null Char
  1029.  
  1030. ken_fix1:    mov    cchR_p,0
  1031.         mov    dat.cchResult,0
  1032.  
  1033.         cmp    word ptr dat.cchSystem,0
  1034.         je    kr_sk101
  1035.         call    putsys_r
  1036.  
  1037. kr_sk101:    cmp    word ptr dat.cchBuf,0
  1038.         je    short kr_lp1
  1039.         call    putstr_r
  1040.  
  1041. kr_lp1:        call    KYBN_check
  1042.         cmp    dh,0FFh            ;No key in?
  1043.         jne    short kr_sk2        ;No.
  1044.         cmp    sw,1            ;No wait key in?
  1045.         jne    short kr_lp1        ;No.
  1046. kr_lp11:    cmp    word ptr dat.cchBuf,0
  1047.         jne    short kr_lp1
  1048.  
  1049. kr_lp12:    cmp    bh,57h            ;変換,無変換を返さない
  1050.         je    kr_lp1            ;ようにした  by Ken
  1051.         cmp    bh,58h
  1052.         je    kr_lp1
  1053. ken_fix2:    mov    enc,bx
  1054.         mov    key_c,dx
  1055.         jmp    kr_end23
  1056.  
  1057. kr_sk2:        push    ax
  1058.         mov    ax,0900h        ;dummy read
  1059.         int    90h
  1060.         pop    ax
  1061.         cmp    word ptr dat.cchBuf,0    ;未確定文字列があるか?
  1062.         jne    kr_sk22
  1063.  
  1064. kr_sk21:    cmp    ah,0FFh        ;変換の必要ありか?
  1065.         jne    kr_lp12        ;無。
  1066.  
  1067. kr_sk22:    mov    byte ptr dat.wType,0
  1068.         mov    byte ptr dat.wScan,bh
  1069.         mov    byte ptr dat.wAscii,dl
  1070.         mov    byte ptr dat.wStatus,bl
  1071.  
  1072.         mov    si,offset enc_str
  1073.         mov    enc_cnt,1
  1074.         mov    [si],dl
  1075.         inc    si
  1076.  
  1077. ;Bug Fixed by K.MIYAZAKI
  1078. ;   Thanks a lot!!
  1079. ;
  1080.                 mov     ah,1eh
  1081.                 cmp     bh,4dh
  1082.                 je      ken_apn2
  1083.                 mov     ah,1dh
  1084.                 cmp     bh,4fh
  1085.                 je      ken_apn2
  1086.                 mov     ah,1fh
  1087.                 cmp     bh,50h
  1088.                 je      ken_apn2
  1089.                 mov     ah,1ch
  1090.                 cmp     bh,51h
  1091.                 je      ken_apn2
  1092.  
  1093.         mov    ah,7Fh
  1094.         cmp    bh,4Bh
  1095.         je    ken_apn2
  1096.         mov    ah,0Bh
  1097.         cmp    bh,4Eh
  1098.         je    ken_apn2
  1099.  
  1100.                 mov     ah,1bh
  1101.                 cmp     bh,48h
  1102.                 je      ken_apn2
  1103.                 cmp     bh,6Dh
  1104.                 je      ken_apn2
  1105.                 cmp     bh,72h
  1106.                 je      ken_apn2
  1107.                 cmp     bh,73h
  1108.                 jne     ken_apn5
  1109.  
  1110. ken_apn2:
  1111.             cmp     old_cchS,0
  1112.                 jne     ken_apn3
  1113.                 cmp     old_cchB,0
  1114.                 jne     ken_apn3
  1115.                 jmp     kr_lp12
  1116. ken_apn3:       
  1117.                 mov     byte ptr dat.wAscii,ah
  1118.  
  1119.                 push    ax
  1120.                 push    bx
  1121.                 push    dx
  1122. ken_apn31:      mov     ah,07h
  1123.                 int    90h
  1124.                 cmp     dh,0ffh
  1125.                 je      ken_apn4
  1126.                 cmp     bh,byte ptr dat.wScan
  1127.                 jne     ken_apn4
  1128.                 mov     ax,0900h
  1129.                 int    90h
  1130.         mov    [si],dl
  1131.         inc    si
  1132.         inc    enc_cnt
  1133.         jmp    ken_apn31
  1134.  
  1135. ken_apn4:       
  1136.                 pop     dx
  1137.                 pop     bx
  1138.                 pop     ax
  1139. ken_apn5:       
  1140. ;
  1141. ;
  1142. ;
  1143.  
  1144.         call    KKInOut
  1145.  
  1146.         cmp    [dat.cchResult],0    ;No result string?
  1147.         jne    kr_sk3            ;No.
  1148.  
  1149.         call    putstr_r
  1150.  
  1151.         call    putsys_r
  1152.  
  1153.         mov    kancnvflg,1        ; Apend OAKLIB by Ken
  1154.  
  1155.         jmp    kr_lp1
  1156.  
  1157. kr_sk3:
  1158. ;        cmp    dat.cchBuf,0        ; Wait is Code ? by Ken
  1159. ;        jne    kr_sk301
  1160.  
  1161.         mov    di,word ptr[dat.lpchResult]
  1162.         add    di,dat.cchResult
  1163.         dec    di
  1164.         mov    si,offset enc_str
  1165.         mov    cx,enc_cnt
  1166.  
  1167.         mov    al,byte ptr dat.wAscii    ;キーコードの復元が必要か?
  1168.         cmp    al,[di]
  1169.         je    kr_sk309    ; Do Cnvert
  1170.         dec    enc_cnt        ; エンコ-ドの禁止 by Ken
  1171.         jmp    kr_sk301
  1172.  
  1173. kr_sk309:    repnz    movsb
  1174.         mov    cx,dat.cchResult
  1175.         add    cx,enc_cnt
  1176.         dec    cx
  1177.         mov    dat.cchResult,cx
  1178.  
  1179. kr_sk301:    mov    si,word ptr[dat.lpchResult]
  1180.         cmp    dl,[si]
  1181.         je    short kr_sk31
  1182.  
  1183. kr_sk4:        mov    dl,[si]
  1184.         xor    dh,dh
  1185.         xor    bh,bh
  1186.  
  1187. kr_sk31:    mov    enc,bx
  1188.         mov    key_c,dx
  1189.  
  1190.         call    clrstr
  1191.  
  1192.         mov    cchR_p,1
  1193.         mov    ax,dat.cchResult
  1194.         sub    ax,enc_cnt
  1195.         dec    ax
  1196.         jns    kr_end20
  1197.         xor    ax,ax
  1198. kr_end20:    mov    enc_cnt,ax
  1199. kr_end23:
  1200.         xor    eax,eax
  1201. err3:        pop    bp
  1202.         ret
  1203. KAN_read_s    endp
  1204.  
  1205.     public    KAN_open_s
  1206. KAN_open_s    proc    far
  1207.         push    bp
  1208.         mov    bp,sp
  1209.         mov    ax,cs
  1210.         mov    ds,ax
  1211.         mov    es,ax
  1212.  
  1213.         KYB_KindKb            ;キーボード種類
  1214.         mov    k_kind,al
  1215.  
  1216.         call    KKOpen            ;oak/2 open
  1217.         or    ax,ax
  1218.         jne    err
  1219.         mov    ax,modeW
  1220.         mov    fnc.wMode,ax
  1221.         call    KKMode
  1222.         or    ax,ax
  1223.         jne    err
  1224.         mov    byte ptr dat.wType,0        ;リフレッシュ
  1225.         mov    byte ptr dat.wScan,0
  1226.         mov    byte ptr dat.wAscii,0
  1227.         mov    byte ptr dat.wStatus,0
  1228.         call    KKInOut
  1229.         or    ax,ax
  1230.         jne    err
  1231.         mov    dat.cchResult,0
  1232.         mov    dat.cchSystem,0
  1233.         mov    dat.cchBuf,0
  1234.         mov    old_cchS,0
  1235.         mov    old_cchB,0
  1236.         mov    cchR_p,0
  1237.  
  1238.         mov    ah,07h            ;set shift mode
  1239.         int    90h
  1240.         call    mode_chg
  1241.  
  1242.         xor    eax,eax
  1243. err:        pop    bp
  1244.         ret
  1245. KAN_open_s    endp
  1246.  
  1247.     public    KAN_close_s
  1248. KAN_close_s    proc    far
  1249.         push    bp
  1250.         mov    bp,sp
  1251.         mov    ax,cs
  1252.         mov    ds,ax
  1253.         mov    es,ax
  1254.  
  1255.         mov    ah,07h
  1256.         int    90h
  1257.         or    modeW,1            ;漢字off
  1258.         call    mode_chg
  1259.         call    KKClose
  1260.         or    ax,ax
  1261.         jne    err2
  1262.  
  1263.         xor    eax,eax
  1264. err2:        pop    bp
  1265.         ret
  1266. KAN_close_s    endp
  1267.  
  1268. rmcode    ends
  1269.  
  1270.     end
  1271.